#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll mod = 1e9 + 7;
const int N = 1e6 + 10;

void solve()
{
  int n, a, b, k;
  cin >> n >> a >> b >> k;
  vector<int> val(n + 1);
  for (int i = 1; i <= n; i++)
    cin >> val[i];
  // 表示跳跃j次到i位置时的最大价值 MIN_INT标记不可行
  vector<vector<int>> dp(n + 1, vector<int>(k + 1, INT_MIN));
  // 起始记得改成0 起始是可以转移的
  dp[0][0] = 0;
  int ans = 0;
  // 填充dp空间
  for (int i = 1; i <= n; i++)
  {
    for (int j = 1; j <= k; j++)
    {
      for (int m = a; m <= b; m++)
      {
        // 遍历转移空间用到i-m下标 防越界
        if (i - m < 0)
          break;
        // 遍历转移空间 继承最大价值的转移状态
        // 此处体现了初始值为INT_MIN的用处 如果该i-m,j-1方案不可行 那么自动通过max函数舍去
        dp[i][j] = max(dp[i - m][j - 1] + val[i], dp[i][j]);
      }
      ans = max(ans, dp[i][j]);
    }
  }
  cout << ans << '\n';
  return;
}
int main()
{
  ios::sync_with_stdio(0), cin.tie(0);
  int t;
  cin >> t;
  while (t--)
    solve();

  return 0;
}
